package commons

import (
	"encoding/json"
	"net/http"
	"time"
)

// RequestError 请求异常
type RequestError struct {
	Msg SimpleResponse
}

func (e *RequestError) Error() string {
	return e.Msg.Msg
}

func (e *RequestError) Code() int {
	return e.Msg.Code
}

// SimpleResponse 通用返回参数结构体
type SimpleResponse struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data,omitempty"`
}

// CustomError 自定义异常
func CustomError(code int, msg string) RequestError {
	return RequestError{SimpleResponse{Code: code, Msg: msg}}
}

// CustomServerError 自定义服务端异常
func CustomServerError(msg string) RequestError {
	return RequestError{SimpleResponse{Code: http.StatusInternalServerError, Msg: msg}}
}

// CustomClientError 自定义客户端异常
func CustomClientError(msg string) RequestError {
	return RequestError{SimpleResponse{Code: http.StatusBadRequest, Msg: msg}}
}

// SuccessResponse 预定义的成功返回
var SuccessResponse = SimpleResponse{Code: http.StatusOK, Msg: "success"}

// InvalidErr 预定义异常：无效请求
var InvalidErr = RequestError{SimpleResponse{Code: http.StatusBadRequest, Msg: "Invalid Request"}}

// UnAuthenticationErr 预定义异常：需要认证（登录）
var UnAuthenticationErr = RequestError{SimpleResponse{Code: http.StatusUnauthorized, Msg: "No login"}}

// UnAuthorizationErr 预定义异常：未授权访问
var UnAuthorizationErr = RequestError{SimpleResponse{Code: http.StatusForbidden, Msg: "Unauthorized Access"}}

// LoginExpiredErr 预定义异常：登录已过期
var LoginExpiredErr = RequestError{SimpleResponse{Code: http.StatusUnauthorized, Msg: "Login expired"}}

// ServerError 预定义异常：服务器内部错误
var ServerError = RequestError{SimpleResponse{Code: http.StatusInternalServerError, Msg: "Internal Server Error"}}

// NotFoundError 预定义异常：数据不存在
var NotFoundError = RequestError{SimpleResponse{Code: http.StatusNotFound, Msg: "Data Not found"}}

// --------------------------------------------------
// 业务响应参数封装
// --------------------------------------------------

// Permissions 权限
type Permissions struct {
	Access bool `json:"access"`
	Create bool `json:"create"`
	Update bool `json:"update"`
	Move   bool `json:"move"`
	Delete bool `json:"delete"`
	Own    bool `json:"own"`
}

// CatalogResponse 目录返回参数封装 （多叉树结构）
type CatalogResponse struct {
	Id          int64              `json:"id"`
	ParentId    int64              `json:"parentId"`
	Level       int                `json:"level"`
	Title       string             `json:"title"`
	SubList     []*CatalogResponse `json:"subList"`
	Permissions *Permissions       `json:"permissions"`
}

// DocumentResponse 文档返回参数封装
type DocumentResponse struct {
	Id         int64     `json:"id"`         // 主键
	ParentId   int64     `json:"parentId"`   // 父级Id
	Level      int       `json:"level"`      // 文档层级
	Ancestors  string    `json:"ancestors"`  // 上级列表
	Title      string    `json:"title"`      // 标题
	Author     int64     `json:"author"`     // 作者
	Content    string    `json:"content"`    // 内容
	CreateTime time.Time `json:"createTime"` // 创建时间
	UpdateTime time.Time `json:"updateTime"` // 更新时间

	CreatePermission int `json:"createPermission"` // 创建权限
	UpdatePermission int `json:"updatePermission"` // 更新权限
	DeletePermission int `json:"deletePermission"` // 删除权限
	AccessPermission int `json:"accessPermission"` // 访问权限

}

type UserLoginResponse struct {
	UserID   int64  `json:"userId"`
	UserName string `json:"userName"`
	NickName string `json:"nickName"`
	Token    string `json:"token"`
	Avatar   string `json:"avatar"`
}

// 用户注册接口
type UserRegisterResponse struct {
	UserID   int64  `json:"userId"`
	UserName string `json:"userName"`
	NickName string `json:"nickName"`
	Token    string `json:"token"`
	Avatar   string `json:"avatar"`
}

// 用户获取所属组列表接口
type UserGroupListItemResponse struct {
	ID          int64     `json:"id"`                                  // 组Id
	Name        string    `json:"name"`                                // 组名称
	CreatorID   int64     `json:"creatorId"`                           // 创建者Id
	CreatorName string    `json:"creatorName"`                         // 创建者昵称
	JoinTime    time.Time `json:"joinTime" time_format:"2006-01-02"`   // 加入时间
	CreateTime  time.Time `json:"createTime" time_format:"2006-01-02"` // 加入时间
}

func (u *UserGroupListItemResponse) MarshalJSON() ([]byte, error) {
	type Alias UserGroupListItemResponse
	return json.Marshal(&struct {
		CreateTime string `json:"createTime"`
		*Alias
	}{
		CreateTime: u.CreateTime.Format("2006-01-02"), // 按照 "yyyy-MM-dd" 格式化日期
		Alias:      (*Alias)(u),
	})
}

type FileUploadResponse struct {
	Msg  string                 `json:"msg"`
	Code int                    `json:"code"`
	Data FileUploadResponseData `json:"data"`
}

type FileUploadResponseData struct {
	ErrFiles []string          `json:"errFiles"`
	SuccMap  map[string]string `json:"succMap"`
}

// UserSelfResponse 用户获取自身信息接口
type UserSelfResponse struct {
	UserID     int64     `json:"userId"`
	UserName   string    `json:"userName"`
	NickName   string    `json:"nickName"`
	Email      string    `json:"email"`
	CreateTime time.Time `json:"createTime"`
	Profile    string    `json:"profile"`
	Avatar     string    `json:"avatar"`
}

type UserGroupDetail struct {
	ID        int64             `json:"id"` // 组Id
	CanUpdate bool              `json:"canUpdate"`
	Name      string            `json:"name"`
	Profile   string            `json:"profile"`
	Members   []UserGroupMember `json:"members"`
}

type UserGroupMember struct {
	UserID   int64  `json:"userId"`
	UserName string `json:"userName"`
	Avatar   string `json:"avatar"`
}
